//
//  NSString+Category.h
//  FSProject
//
//  Created by 朱慕之 on 2018/12/13.
//  Copyright © 2018 zhumuzhi. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSString (Category)

#pragma mark - 为空判断 ToolMethod
/** 判断字符串是否为空 */
+ (BOOL)isEmptyString:(NSString *)aStr;

/** 判断字符串是否有空字符 */
- (void)isHaveEmptyString: (NSString *)string
                   result: (void(^)(bool isHave,NSRange range))result;

#pragma mark - 随机字符串 ToolMethod

/**
 * 创建随机文字字符串
 * @param count 文字数量
 */
+ (NSString *)creatRandomStringWithCount: (NSInteger)count;

/**
 * 创建随机数字字符串
 * @param count 文字数量
 */
+ (NSInteger)creatRandomNumberWithCount: (NSInteger)count;


/**
 * 创建随机日期字符串
 * @param length 长度
 */
+ (NSString *)creatRandomDateStringWithLength:(NSInteger)length;

/**
 * unicodeString
 */
- (NSString *)unicodeString;


#pragma mark - 判断工具类 ToolMethod

/**
 *  验证邮箱
 *
 *  @return YES or NO
 */
- (BOOL)isEmail;

/**
 *  验证密码
 *
 *  @return YES or NO
 */
- (BOOL)isPassword;

/**
 *  验证数字
 *
 *  @return YES or NO
 */
- (BOOL)isRealNumbers;

/**
 *  验证手机号码
 *
 *  @return YES or NO
 */
- (BOOL)isMobileNumber;

/**
 *  验证是汉字
 *
 *  @return YES or NO
 */
- (BOOL)isChinese;

/**
 *  校验url
 *
 *  @return YES or NO
 */
- (BOOL)isUrl;

/**
 *  判断文本内容是否全是空格,为空
 *
 *  @return YES or NO
 */
- (BOOL)ifHasBlackSpace;

/**
 校验VIN是否是真实，具体校验规则看文档
 第9位为校验位，为1-9任意一位数字或“X”
 VIN中字母需转换为数字，具体对应关系如下：
 17位VIN，每一位均对应一位加权数，具体对应关系如下
 17位VIN，每一位均对应一位加权数，具体对应关系如下
 
 @return YES or NO
 */
- (BOOL)validateVinIsLegitimate;

/**
 判断字符串中是否含有emoji表情
 @return YES or NO
 */
- (BOOL)validateStringContainsEmoji;

/**
 * 判断字符串是否全是数字
 */
+ (BOOL)isNum:(NSString *)checkedNumString;

/**
 *  是否包涵子字符串
 *
 *  @param subString 传入的字符串
 *
 *  @return YES or NO
 */
- (BOOL)isContainSubString:(NSString *)subString;

/**
 *  车牌号验证
 *
 *  @param carNo 车牌号
 *
 *  @return YES or NO
 */
+ (BOOL)validateCarNo:(NSString *)carNo;

/**
 *  验证身份证号
 *
 *  @param identityCard 身份证号
 *
 *  @return YES or NO
 */
+ (BOOL)validateIdentityCard: (NSString *)identityCard;




#pragma mark - UIFont ToolMethod

/**
 * 根据 文字/字体/最大限制(宽高) 计算Size
 * @param text 文字
 * @param font 计算文字Font
 * @param maxSize 计算的最大长宽限制，一般其中一个为MAXFLOAT
 */
+ (CGSize)sizeWithText:(NSString *)text font:(UIFont *)font maxSize:(CGSize)maxSize;

/**
 * 根据字体/最大限制(宽高) 计算Size
 * @param font 计算文字字体
 * @param maxSize 计算的最大长宽限制，一般其中一个为MAXFLOAT
 */
- (CGSize)sizeWithFont:(UIFont *)font maxSize:(CGSize)maxSize;


/**
 *  计算富文本字体高度
 *
 *  @param lineSpace  行高
 *  @param font       字体
 *  @param width      字体所占宽度
 *
 *  @return 富文本高度
 */
-(CGFloat)getSpaceLabelHeightwithSpeace:(CGFloat)lineSpace withFont:(UIFont*)font withWidth:(CGFloat)width;

/**
 *  计算label的尺寸
 *
 *  @param label label
 *
 *  @return 文字所占的尺寸
 */
+ (CGSize)sizeWithLabel:(UILabel *)label;

/**
 *  文字的内容、字体大小 计算文字所占的尺寸
 *
 *  @param text    文字内容
 *  @param font    文字字体
 *
 *  @return 文字所占的尺寸
 */
+ (CGSize)sizeWithText:(NSString *)text andFont:(UIFont *)font;

/**
 *  根据文字的内容、字体大小、最大尺寸范围 计算文字所占的尺寸
 *
 *  @param text    文字内容
 *  @param font    文字字体
 *  @param maxSize 最大尺寸范围
 *
 *  @return 文字所占的尺寸
 */
+ (CGSize)sizeWithText:(NSString *)text andFont:(UIFont *)font andMaxSize:(CGSize)maxSize;


#pragma mark - Time ToolMethod
/**
 *  获取当前日期字符串
 *
 *  @param format 格式化字符串
 */
+ (NSString *)getNowDateStringWithDateFormat:(NSString *)format;

/**
 *  获取当前的年/月
 *
 *  @param type 1:年 2:月
 */
+ (NSInteger)getNowYearOrMonth:(int)type;

/**
 *  获取当前的年/月
 *
 *  @param regStr 注册时间
 */
+ (NSInteger)getMonthWithRegDate:(NSString *)regStr;


#pragma mark - 数字计算 ToolMethod

/**
 *  浮点数处理并去掉多余的0
 *
 *  @param string string description
 *  @param round  round description
 *  @param format format description
 *
 *  @return return value description
 */
+ (NSString *)stringDisposeWithString:(NSString *)string rounding:(BOOL)round format:(NSString *)format;

/**
 *  decimalwithFormat
 *
 *  @param format format description
 *  @param floatV floatV description
 *
 *  @return return value description
 */
- (NSString *)decimalwithFormat:(NSString *)format  floatV:(float)floatV;

#pragma mark - 沙盒路径

/**
 * Documents @
 * Library
 * - Caches @
 * - Preferences
 * tmp @
 *
 * Documents: 存放长期使用文件，苹果建议将程序创建产生的文件以及应用浏览产生的文件数据保存在该目录下，iTunes备份和恢复的时候会包括此目录
 * Library: 系统存放文件，存储程序的默认设置或其它状态信息
 *  - Caches：存放缓存文件，保存应用的持久化数据，用于应用升级或者应用关闭后的数据保存，不会被itunes同步，所以为了减少同步的时间，可以考虑将一些比较大的文件而又不需要备份的文件放到这个目录下。
 *  - Preferences：保存应用的所有偏好设置，IOS的Settings应用会在该目录中查找应用的设置信息。
 * tmp: 临时文件,APP重启,该目录下的文件会清空提供一个即时创建临时文件的地方，但不需要持久化，在应用关闭后，该目录下的数据将删除，也可能系统在程序不运行的时候清除。
 *
 */

/**
 * Documents: 存放长期使用文件，苹果建议将程序创建产生的文件以及应用浏览产生的文件数据保存在该目录下，iTunes备份和恢复的时候会包括此目录
 */
+ (NSString *)getDocumentPath;

/**
 * Library: 系统存放文件，存储程序的默认设置或其它状态信息
 *   Caches：存放缓存文件，保存应用的持久化数据，用于应用升级或者应用关闭后的数据保存，不会被itunes同步，所以为了减少同步的时间，可以考虑将一些比较大的文件而又不需要备份的文件放到这个目录下。
 */
+ (NSString *)getCachePath;


/**
 *  Library: 系统存放文件，存储程序的默认设置或其它状态信息
 *  Preferences：保存应用的所有偏好设置，IOS的Settings应用会在该目录中查找应用的设置信息。
 */
+ (NSString *)getPreferencePath;

/**
 * tmp: 临时文件,APP重启,该目录下的文件会清空提供一个即时创建临时文件的地方，但不需要持久化，在应用关闭后，该目录下的数据将删除，也可能系统在程序不运行的时候清除。
 */
+ (NSString *)getTempPath;


#pragma mark - 未分类 ToolMethod


/**
 *  字符串替换
 *
 *  @param stringToBeChanged     stringToBeChanged description
 *  @param stringToBeChangedWith stringToBeChangedWith description
 *  @param oldStr                oldStr description
 *
 *  @return 替换后的字符串
 */
+ (NSString *)replaceOldStr:(NSString *)stringToBeChanged withStr:(NSString *)stringToBeChangedWith withString:(NSString *)oldStr;

/**
 *  将字典、数组 转换为json字符串
 *
 *  @param object 字典、数组
 *
 *  @return 转换为json字符串
 */
+ (NSString *)jsonStringWithObject:(id)object;

/**
 获取垂直字符串：通过在每个字符后面添加\n
 
 @return 垂直字符串
 */
- (NSString *) verticalString;

/**
 *  新字符为空处理
 *
 *  @param oldStr oldStr description
 *
 *  @return return value description
 */
+ (NSString *)newNotNullStr:(NSString *)oldStr;

/**
 将url中带的参数转为字典
 
 @param urlStr url
 @return 返回字典
 */
+ (NSMutableDictionary *)getURLParameters:(NSString *)urlStr;


#pragma mark - 加密相关

#pragma mark base64

/**
 *  base64编码
 *
 *  @return 编码后的字符串
 */
- (NSString *)base64Encode;

/**
 *  base64解码
 *
 *  @return 解码后的字符串
 */
- (NSString *)base64Decode;

#pragma mark Hash Md5

/**
 *  md5
 *
 *  @return md5后的字符串
 */
- (NSString *)md5String;

/**
 *  sha1
 *
 *  @return sha1后的字符串
 */
- (NSString *)sha1String;

/**
 *  sha256
 *
 *  @return sha256后的字符串
 */
- (NSString *)sha256String;

/**
 *  sha512
 *
 *  @return sha512后的字符串
 */
- (NSString *)sha512String;


#pragma mark - 网络状态

/**
 * 获取网络状态，使用 Reachability 检测
 */
+ (NSString *)networkStatus;

/**
 * 获取网络类型，使用 CTTelephonyNetworkInfo 判断
 */
+ (NSString *)getNetType;


@end

NS_ASSUME_NONNULL_END
